package com.erqi.time;


import com.erqi.dao.plcDao;
import com.erqi.pojo.PLCResources;
import com.erqi.pojo.Qrandplc;
import com.erqi.pojo.Message;
import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.api.factory.S7ConnectorFactory;
import com.github.s7connector.exception.S7Exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * @Author king
 * @Date 2020/6/1 21:17
 * @Version 1.0
 */
@Configuration
@Slf4j
public class Time {
   // public static Logger log = Logger.getLogger(Time.class);

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private List<String> list = new ArrayList<String>();
    private List<String> list332 = new ArrayList<String>();

    public List<String> getList332() {
        return list332;
    }

    public void setList332(List<String> list332) {
        this.list332 = list332;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }
    S7Connector connector =null;
    public Time() {
        list.add(0,"18BT11111111111-1");
        list332.add(0,"18BT11111111111-6");
    }

    @Autowired
    plcDao qrMapper;
    @Autowired
    PLCResources plcResources;

    //@Scheduled(cron = "*/1 * * * * ?")
    private synchronized void  ScheduledPLCToMysql3Line_36(){
        if (connector==null){
            log.error("————    连接被关闭    ————");
            S7Open();//如果连接被关闭打开连接
            log.info("————  连接重新被打开  ————");
        }else{
            log.info("————   连接打开   ————");
            log.info("———   开始读取数据   ———");
            String StrPlc=null;
            try{    //下边读取数据参数从配置文件读取
                byte[] PlcData = connector.read(DaveArea.DB, plcResources.getAreaNumber(), plcResources.getBytes(), plcResources.getOffset());
                //把读取的数据转为String
                 StrPlc = new String(PlcData, StandardCharsets.UTF_8).trim();
                log.info("读数据为:"+StrPlc);
                list.add(1,StrPlc); //把读取到的数据添加到集合中
                //判断集合内数据 第一个跟第二个是否相同
                if (list.get(0).equals(list.get(1))){
                    log.info("—— 数据相同不进行操作   ——");
                    list.remove(0);
                }else{
                    log.info("—— 开始进行入库操作   ——");
                    String PlcStr = list.get(1);
                    list.remove(0);
                    String code = PlcStr.substring(2,17);//截取单晶号
                    String code_BT = PlcStr.substring(2,3);
                    if (code_BT.equals("0")){   //判断BT是否错误 如果错误更正
                        log.info("—— 检测到数据存在0 已经修复 ++   ——");
                        code="BT"+PlcStr.substring(4);
                    }
                    String Num_machine=PlcStr.substring(0,2);   //截取出设备号
                    int i = PLCToMysqlMethod(Num_machine, code, "3");//roBot  线体号
                    if (i==1){
                        log.info("———   数据入库成功   ———");
                    }else{
                        log.info("———   数据入库失败   ———");
                    }
                }

            }catch (StringIndexOutOfBoundsException e){
                log.error("下标越界 异常拦截");
                //加入只有 17B 或者长度不付的进入这
                String Num_machine=StrPlc.substring(0,2);   //截取出设备号
                String code = StrPlc.substring(2);//截取单晶号
                Qrandplc plCdata = new Qrandplc();
                plCdata.setDate(new Date());
                plCdata.setNumRobot("3");
                plCdata.setWorkshop("2");//车间名称
                if ("17".equals(Num_machine)||"18".equals(Num_machine)||"19".equals(Num_machine)){
                    plCdata.setType("开方机");
                }else{
                    plCdata.setType("一体机");
                }
                plCdata.setState1("入库失败");
                plCdata.setQrcode(code);
                plCdata.setNumMachine(Num_machine);
                plCdata.setUser("yonghu");
                int i = qrMapper.insertSelective(plCdata);
                if (i==1){
                    log.error("———   读取长度不足入库成功   ———");

                }else{
                    log.error("———   读取长度不足入库失败   ———");

                }
                list.remove(0);
            }catch(S7Exception e){
                log.error("———   S7Exception 异常   ———");
                log.info("关闭连接 并赋值空");
                connector =null;
            }catch(IndexOutOfBoundsException e){
                list.clear();
                list.add(0,"18BT66666666666-6");
                list.add(1,"18BT88888888888-8");
                log.error("———   list下标越界   ———");
            }
            finally {
                log.info("————     END    —————");
                log.info("");
            }
        }
    }

   // @Scheduled(cron = "*/1 * * * * ?")
    private synchronized void  ScheduledPLCToMysql3Line_330(){
        if (connector==null){
            log.error("————    连接被关闭330    ————");
            S7Open();//如果连接被关闭打开连接
            log.info("————  连接重新被打开330  ————");
        }else{
            log.info("————   连接打开330   ————");
            log.info("———   开始读取数据330   ———");
            String StrPlc=null;
            try{    //下边读取数据参数从配置文件读取
                byte[] PlcData = connector.read(DaveArea.DB, plcResources.getAreaNumber(), plcResources.getBytes(), 332);
                //把读取的数据转为String
                StrPlc = new String(PlcData, StandardCharsets.UTF_8).trim();
                log.info("读数据为:"+StrPlc);
                list332.add(1,StrPlc); //把读取到的数据添加到集合中
                //判断集合内数据 第一个跟第二个是否相同
                if (list332.get(0).equals(list332.get(1))){
                    log.info("—— 数据相同不进行操作330   ——");
                    list332.remove(0);
                }else{
                    log.info("—— 开始进行入库操作330   ——");
                    String PlcStr = list332.get(1);
                    list332.remove(0);  //
                    String code = PlcStr.substring(2,17);//截取单晶号
                    String Num_machine=PlcStr.substring(0,2);   //截取出设备号
                    String code_BT = PlcStr.substring(2,3);
                    if (code_BT.equals("0")){   //判断BT是否错误 如果错误更正
                        log.info("—— 检测到数据存在0 已经修复 ++330   ——");
                        code="BT"+PlcStr.substring(4);
                    }
                    int i = PLCToMysqlMethod332(Num_machine, code, "3");//roBot  线体号
                    if (i==1){
                        log.info("———   数据入库成功 330  ———");
                    }else{
                        log.info("———   数据入库失败330   ———");
                    }
                }

            }catch (StringIndexOutOfBoundsException e){
                log.error("下标越界 异常拦截 330");
                //加入只有 17B 或者长度不付的进入这
                String Num_machine=StrPlc.substring(0,2);   //截取出设备号
                String code = StrPlc.substring(2);//截取单晶号
                Qrandplc plCdata = new Qrandplc();
                plCdata.setDate(new Date());
                plCdata.setNumRobot("3");
                plCdata.setWorkshop("2");//车间名称
                if ("17".equals(Num_machine)||"18".equals(Num_machine)||"19".equals(Num_machine)){
                    plCdata.setType("开方机");
                }else{
                    plCdata.setType("一体机");
                }
                plCdata.setState1("入库失败");
                plCdata.setQrcode(code);
                plCdata.setNumMachine(Num_machine);
                plCdata.setUser("yonghu");
                int i = qrMapper.insertSelective(plCdata);
                if (i==1){
                    log.error("———   读取长度不足入库成功330   ———");

                }else{
                    log.error("———   读取长度不足入库失败330   ———");

                }
                list332.remove(0);
            }catch(S7Exception e){
                log.error("———   S7Exception 异常330   ———");
                log.info("关闭连接 并赋值空330");
                connector =null;
            }catch(IndexOutOfBoundsException e){
                list332.clear();
                list332.add(0,"18BT66666666666-6");
                list332.add(1,"18BT88888888888-8");
                log.error("———   list下标越界 330  ———");
            }
            finally {
                log.info("————     END 330   —————");
                log.info("");
            }
        }
    }




    private void S7Open(){ //如果连接被关闭打开连接

        try{
            connector =  S7ConnectorFactory
                    .buildTCPConnector()
                    .withHost(plcResources.getIp1()) //plc 地址
                    .withRack(plcResources.getRack()) //架机号
                    .withSlot(plcResources.getSlot()) //插槽号
                    .build();
        }catch (Exception e){
            log.error("打开连接出现异常哦--");
        }

    }


    public int PLCToMysqlMethod(String Num_machine,String QRcode,String Num_roBot){
        if (!"".equals(Num_machine)&&!"".equals(QRcode)){
            Qrandplc plCdata = new Qrandplc();
            plCdata.setDate(new Date());
            plCdata.setNumRobot(Num_roBot);
            plCdata.setWorkshop("2");//车间名称
            if ("17".equals(Num_machine)||"18".equals(Num_machine)||"19".equals(Num_machine)){//判断设备号如果是开方机进行查询
                Integer i = qrMapper.selectByTypeAndCode("开方机", QRcode);
                System.out.println("i = " + i);
                if (i<=0){
                    plCdata.setState1("入库成功");
                }else{
                    plCdata.setState1("重复");
                    log.info("————   数据重复   ————");
                }
                plCdata.setType("开方机");
                plCdata.setQrcode(QRcode);
                plCdata.setNumMachine(Num_machine);
                plCdata.setUser("yonghu");
                int seve1 = qrMapper.insertSelective(plCdata);
                if (seve1==1){
                    log.info("—— 当前用户为 ——");
                    return 1;
                }else{
                    return 0;
                }
            }else{
                Integer i = qrMapper.selectByTypeAndCode("一体机", QRcode);
                System.out.println("i = " + i);
                if (i<=0){
                    plCdata.setState1("入库成功");
                }else{
                    plCdata.setState1("重复");
                    log.info("————   数据重复   ————");
                }
                plCdata.setType("一体机");
                plCdata.setQrcode(QRcode);
                plCdata.setNumMachine(Num_machine);
                plCdata.setUser("yonghu");
                int seve1 = qrMapper.insertSelective(plCdata);
                if (seve1==1){
                    log.info("—— 当前用户为 ——");
                    return 1;
                }else{
                    return 0;
                }
            }
        }else{
            return 0;//0为空
        }
    }

    public int PLCToMysqlMethod332(String Num_machine,String QRcode,String Num_roBot){
        if (!"".equals(Num_machine)&&!"".equals(QRcode)){
            Qrandplc plCdata = new Qrandplc();
            plCdata.setDate(new Date());
            plCdata.setNumRobot(Num_roBot);
            plCdata.setWorkshop("2");//车间名称
            if ("17".equals(Num_machine)||"18".equals(Num_machine)||"19".equals(Num_machine)){//判断设备号如果是开方机进行查询
                Integer i = qrMapper.selectByTypeAndCode("开方机", QRcode);
                System.out.println("i = " + i);
                if (i<=0){
                    plCdata.setState1("入库成功");
                }else{
                    plCdata.setState1("重复");
                    log.info("————   数据重复   ————");
                }
                plCdata.setType("开方机");
                plCdata.setQrcode(QRcode);
                plCdata.setNumMachine(Num_machine);
                plCdata.setUser("(手输)");
                int seve1 = qrMapper.insertSelective(plCdata);
                if (seve1==1){
                    log.info("—— 当前用户为 ——(手输)");
                    return 1;
                }else{
                    return 0;
                }
            }else{
                Integer i = qrMapper.selectByTypeAndCode("一体机", QRcode);
                System.out.println("i = " + i);
                if (i<=0){
                    plCdata.setState1("入库成功");
                }else{
                    plCdata.setState1("重复");
                    log.info("————   数据重复   ————");
                }
                plCdata.setType("一体机");
                plCdata.setQrcode(QRcode);
                plCdata.setNumMachine(Num_machine);
                plCdata.setUser("(手输)");
                int seve1 = qrMapper.insertSelective(plCdata);
                if (seve1==1){
                    log.info("—— 当前用户为 ——(手输)");
                    return 1;
                }else{
                    return 0;
                }
            }
        }else{
            return 0;//0为空
        }
    }
    /**
     * 每天的0点关闭一次连接
     */
    //@Scheduled(cron = "0 0 0 * * ?")
    private void close(){
        try {
            connector.close();
            log.info("定时关闭连接 并赋值空");
            connector =null;
        } catch (Exception e) {
            log.error("————     关闭出现异常    —————");
            e.printStackTrace();
        }

    }



}
